﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Sistema.Util
{
    public abstract class SistemaException : Exception
    {
        private DateTime _dataErro;
        private String _mensagemAoUsuario;

        #region Gets and Sets

        public String MensagemAoUsuario
        {
            get { return _mensagemAoUsuario; }
            set { _mensagemAoUsuario = value; }
        }
        public DateTime DataErro
        {
            get { return _dataErro; }
            set { _dataErro = value; }
        }

        #endregion

        public SistemaException(String MensagemErro, String MensagemAoUsuario, Exception InnerException = null)
            : base(MensagemErro, InnerException)
        {
            this.DataErro = DateTime.Now;
        }

        public SistemaException(SistemaException InnerException, String MensagemErro = null, String MensagemAoUsuario = null)
            : base(MensagemErro == null ? InnerException.Message : MensagemErro, InnerException)
        {
            this.MensagemAoUsuario = MensagemAoUsuario == null ? InnerException.MensagemAoUsuario : MensagemErro;
            this.DataErro = InnerException.DataErro;
        }

        private void GerarLog()
        {
            //TODO: implementar o log para tentar nos informar de tudo sobre o erro;    
        }

        private String GeraDadosInnerException()
        {
            StringBuilder Retorno = new StringBuilder(String.Empty);
            try
            {
                Exception excecao = base.InnerException;
                while (excecao != null)
                {
                    Retorno.AppendLine(excecao.Message);
                    excecao = excecao.InnerException;
                }
            }
            catch
            {
                return "Não foi possivel ler os dados do InnerException.";
            }
            return Retorno.ToString();
        }

        private String GeraDadosStackTrace()
        {
            StringBuilder retorno = new StringBuilder(String.Empty);
            try
            {
                retorno.Append(base.StackTrace);
            }
            catch
            {
                return "Não foi possivel ler os dados do StackTrace.";
            }
            return retorno.ToString();
        }
    }
}
